﻿using Ebusiness_OrderService.DomainEvent;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Volo.Abp.Domain.Entities;

namespace Ebusiness_OrderService.Model
{
    //1、目的:高内聚，低耦合。有关系的实体紧密协作而关系很弱的实体被隔离。
    //2、把关系紧密的实体放到一个聚合中，每个聚合中有一个实体作为聚合根(Aggregate Root)，所有对于聚合内对象的访问都通过聚合根来进行，外部对象只能持有对聚合根的引用。
    //3、聚合根不仅仅是实体，还是所在聚合的管理者。
    //订单聚合:订单(聚合根实体)、订单明细(普通实体)
    [Table("T_Order")]
    public class Order : BaseDomainEvents
    {
        public Order()
        {
            AddDmoainEvent(new OrderAddNotification() { Name = "添加用户了" });
        }

        //聚合:高内聚，低耦合。把关系强的实体放到同一个聚合中，把其中一个实体做为“聚合根”，对于同一个聚合内的其他实体，都通过聚合根实体进行。
        //public Guid Id { get; set; } = Guid.NewGuid();         // 主键

        [MaxLength(200)]
        public string? OrderNo { get; set; }                    // 系统订单编号（唯一）
        public Guid? UserId { get; set; }                      // 下单用户ID（可为空，用于游客订单）
        [MaxLength(200)]
        public string? UserName { get; set; }                   // 用户名称（冗余）
        [MaxLength(200)]
        public string? OrderType { get; set; }                  // 订单类型（商品订单、服务订单、订阅等）

        public decimal? TotalAmount { get; set; }               // 订单总金额（含税）
        public decimal? DiscountAmount { get; set; }            // 优惠金额
        public decimal? PayableAmount { get; set; }             // 应付金额（总额 - 优惠）
        [MaxLength(200)]
        public string Currency { get; set; } = "CNY";          // 币种
        [MaxLength(200)]
        public string? PaymentStatus { get; set; }              // 支付状态（待支付、已支付、已退款）
        [MaxLength(200)]
        public string? OrderStatus { get; set; }                // 订单状态（待处理、已完成、已取消）
        [MaxLength(200)]
        public string? PaymentMethod { get; set; }              // 支付方式（微信、支付宝、银行卡等）
        public DateTime? PaidTime { get; set; }                // 支付时间
        [MaxLength(200)]
        public string? ShippingStatus { get; set; }             // 配送状态（未发货、已发货、已收货）
        public DateTime? ShippedTime { get; set; }             // 发货时间
        public DateTime? DeliveredTime { get; set; }           // 收货/完成时间
        [MaxLength(200)]
        public string? RecipientName { get; set; }              // 收货人姓名
        [MaxLength(200)]
        public string? RecipientPhone { get; set; }             // 收货人电话
        [MaxLength(200)]
        public string? ShippingAddress { get; set; }            // 收货地址
        [MaxLength(200)]
        public string? Note { get; set; }                       // 买家备注/留言
        [MaxLength(200)]
        public string? AdminNote { get; set; }                  // 管理员备注
        public bool IsDeleted { get; set; } = false;           // 是否逻辑删除
        public DateTime CreatedAt { get; set; } = DateTime.UtcNow; // 创建时间
        public DateTime? UpdatedAt { get; set; }               // 更新时间

        //聚合:高内聚，低耦合。把关系强的实体放到同一个聚合中，把其中一个实体做为“聚合根”，对于同一个聚合内的其他实体，都通过聚合根实体进行。
        public List<OrderDetails> orderDetails { get; set; } = new List<OrderDetails>();

        //业务中需要操作聚合根中的其他实体，需要在聚合根中定义操作聚合根中其他实体的方法
        public void AddorderDetails(string productId)
        {
            //存在则修改，不存在则添加
        }
    }
}
